﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using ZilLion.Service.Core.ModelBase;
using ZLWeb.WebApiEntityBase.RedisEntity;

namespace ZL.Web.Utility.Cache
{
    public class GloabAccidCacheLoader
    {
        public static bool HasAccidCache { get; set; }
        public static object tmp = new object();
        static GloabAccidCacheLoader()
        {
            HasAccidCache = true;
        }
        public IGloabAccidCacheHandler GloabAccidCacheHandler { get; set; }
        public List<ICRMDbContext> Contexts { get; set; }
        public GloabAccidCacheLoader(IGloabAccidCacheHandler gloabAccidCacheHandler, List<ICRMDbContext> contexts)
        {
            GloabAccidCacheHandler = gloabAccidCacheHandler;
            Contexts = contexts;
        }

        private void CheckCacheItems()
        {
            try
            {
                while (true)
                {
                    Thread.Sleep(1000000);
                    if (!HasAccidCache)
                    {
                        AddAccidModelToCache();
                        SetHasAccidCache(true);
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }

        public void AddAccidCacheWatch()
        {
            TaskFactory tf = new TaskFactory();
            Task task1 = tf.StartNew(CheckCacheItems);
        }

        public void AddAccidModelToCache()
        {
            List<AccidModel> items = GetAccidPool();
            Console.WriteLine("完成加载账号" + items.Count + "个");
            Dictionary<string,AccidModel > TMP=new Dictionary<string, AccidModel>();
            foreach (var accidModel in items)
            {
                if (!string.IsNullOrEmpty(accidModel.scardno))
                {
                    if(!TMP.ContainsKey("1" + accidModel.scardno))
                    TMP.Add("1" + accidModel.scardno, accidModel);
                   // SERedisHelper.DSet<AccidModel>("1" + accidModel.scardno, accidModel, null);
                }
                if (!string.IsNullOrEmpty(accidModel.openid))
                {
                    if (!TMP.ContainsKey("2" + accidModel.openid))
                        TMP.Add("2" + accidModel.openid, accidModel);
                    if (!string.IsNullOrEmpty(accidModel.cellphone))
                    {
                        if (!TMP.ContainsKey("4" + accidModel.cellphone))
                            TMP.Add("4" + accidModel.cellphone, accidModel);
                        //SERedisHelper.DSet<AccidModel>("4" + accidModel.cellphone, accidModel, null);
                    }
                    //SERedisHelper.DSet<AccidModel>("2" + accidModel.openid, accidModel, null);
                }
                if (!string.IsNullOrEmpty(accidModel.wxcardno))
                {
                    if (!TMP.ContainsKey("6" + accidModel.wxcardno))
                        TMP.Add("6" + accidModel.wxcardno, accidModel);
                   // SERedisHelper.DSet<AccidModel>("6" + accidModel.wxcardno, accidModel, null);
                }
            }
            SERedisHelper.BatchSet(TMP, null);
            Console.WriteLine("加载缓存完成");
        }

        public void AddModelToCache(string openid)
        {
            List<AccidModel> items = GetAccidPool(true, openid);
            Console.WriteLine("完成加载账号" + items.Count + "个");
            Dictionary<string, AccidModel> TMP = new Dictionary<string, AccidModel>();
            foreach (var accidModel in items)
            {
                if (!string.IsNullOrEmpty(accidModel.scardno))
                {
                    if (!TMP.ContainsKey("1" + accidModel.scardno))
                        TMP.Add("1" + accidModel.scardno, accidModel);
                    // SERedisHelper.DSet<AccidModel>("1" + accidModel.scardno, accidModel, null);
                }
                if (!string.IsNullOrEmpty(accidModel.openid))
                {
                    if (!TMP.ContainsKey("2" + accidModel.openid))
                        TMP.Add("2" + accidModel.openid, accidModel);
                    if (!string.IsNullOrEmpty(accidModel.cellphone))
                    {
                        if (!TMP.ContainsKey("4" + accidModel.cellphone))
                            TMP.Add("4" + accidModel.cellphone, accidModel);
                        //SERedisHelper.DSet<AccidModel>("4" + accidModel.cellphone, accidModel, null);
                    }
                    //SERedisHelper.DSet<AccidModel>("2" + accidModel.openid, accidModel, null);
                }
                if (!string.IsNullOrEmpty(accidModel.wxcardno))
                {
                    if (!TMP.ContainsKey("6" + accidModel.wxcardno))
                        TMP.Add("6" + accidModel.wxcardno, accidModel);
                    // SERedisHelper.DSet<AccidModel>("6" + accidModel.wxcardno, accidModel, null);
                }
            }
            SERedisHelper.BatchSet(TMP, null);
            Console.WriteLine("加载缓存完成");
        }

        Dictionary<string, AccidModel> temps = new Dictionary<string, AccidModel>();
        private List<AccidModel> GetAccidPool(bool issingle=false,string openid=null)
        {
            temps.Clear();
            List<AccstatModel> models = new List<AccstatModel>();
            foreach (var item in Contexts)
            {
                GloabAccidCacheHandler.SetContext(item);
                IEnumerable<AccstatModel> items = null;
                if (!issingle)
                {
                    items = GloabAccidCacheHandler.GetAccidModelItems();
                }
                else
                {
                    items = GloabAccidCacheHandler.GetAccidModelItem(openid);
                }
                models.AddRange(items);
            }
         
            foreach (var model in models.OrderBy(tr=>tr.ctype))
            {
                if (temps.ContainsKey(model.ctype.ToString()+model.caccid.ToString()))
                {
                    AccidModel accid = temps[model.ctype.ToString() + model.caccid.ToString()] as AccidModel;
                    SetAccidModelProperty(accid, model);
                }
                else
                {
                    AccidModel accid = new AccidModel();
                    SetAccidModelProperty(accid, model);
                    temps.Add(model.ctype.ToString() + model.caccid.ToString(), accid);
                }
            }
            return temps.Values.ToList();
        }

        private  void SetAccidModelProperty(AccidModel accid, AccstatModel model)
        {
            if (model.ctype == 1)
            {
                accid.cellphone = model.acccellno;
                accid.scardno = model.ccardno;
                accid.accid = model.caccid;
                accid.acczt = model.accsta;
                accid.ConstrName = model.mikey;
            }
            if (model.ctype == 2)
            {
                accid.cellphone = model.acccellno;
                accid.openid = model.ccardno;
                accid.accid = model.caccid;
                accid.acczt = model.accsta;
                accid.ConstrName = model.mikey;
            }
            if (model.ctype == 6)
            {
                if (temps.ContainsKey("2" + model.caccid.ToString()))
                {
                    AccidModel accid1 = temps["2"  + model.caccid.ToString()] as AccidModel;
                    accid.openid = accid1.openid;
                    accid1.wxcardno = model.ccardno;
                }
                accid.cellphone = model.acccellno;
                accid.wxcardno = model.ccardno;
                accid.accid = model.caccid;
                accid.acczt = model.accsta;
                accid.ConstrName = model.mikey;
            }
        }

        public static void CheckAccidCache()
        {
            if (!HasAccidCache)
            {
                throw new Exception("服务正在重启，请稍后再试！");
            }
        }

        public static void SetHasAccidCache(bool b)
        {
            lock (tmp)
            {
                HasAccidCache = b;
            }
        }
    }

}
